package com.burukeyou.smartdi.proxyspi.factory;

import com.burukeyou.smartdi.config.SpringBeanContext;
import com.burukeyou.smartdi.proxyspi.spi.EnvironmentProxySPI;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.env.Environment;
import org.springframework.stereotype.Component;

/**
 * 实现代理对象的方式
 *
 * @author  caizhihao
 */
@Component
public class EnvironmentProxyFactory implements AnnotationProxyFactory<EnvironmentProxySPI> {

    @Autowired
    private Environment environment;

    @Override
    public Object getProxy(Class<?> targetClass, EnvironmentProxySPI spi) {
        /*
        Environment.resolvePlaceholders 是 Spring 框架中一个实用的方法，用于解析字符串中的占位符，格式通常为 ${key}，${key:123} :后面为未定义默认值；例如： ${server.port:8080}，如果 server.port 未定义，将使用默认值 8080
        resolvePlaceholders 方法会查找 text 字符串中的占位符并将其替换为配置环境中定义的对应值。
        它通过 Environment 接口访问配置属性，这些属性可以来源于：
            application.properties 或 application.yml
            系统环境变量
            Java 系统属性
            自定义的 PropertySource（如 .properties 或 .yml）的形式存在
         */
        String value = environment.resolvePlaceholders(spi.value());
        Object bean = null;
        try {
            // 从spring容器里面获取对象
            bean = SpringBeanContext.getBeanByAllName(value);
        } catch (Exception e) {
            throw new RuntimeException("can not find yml spiBean for value " + value,e);
        }
        return bean;
    }

}
